/**
  ******************************************************************************
  * @file    BSP_gpio.c
  * @author  Silan - MC Team
  * @version 1.0.0
  * @date    2017/07/19
  * @brief   GPIO Related Config Source File
  * @details None
	* @note    None
  ******************************************************************************
  * @attention
  * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
  * AS A RESULT, SILAN MICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
  * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
  * CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
  * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
	*
  ******************************************************************************
	* Change History
	* -# 2017/07/19 | v1.0.0 | Wangjianlong | Creat file.
	*
	******************************************************************************
  */

/*******************************************************************************
 * Include file
 ******************************************************************************/
#include "SC32F58128.h"
#include "BSP_gpio.h"
#include "basic_fun.h"

/*******************************************************************************
 * Global data for the project
 ******************************************************************************/

/*******************************************************************************
 * Local data for the current file
 ******************************************************************************/

/*******************************************************************************
 * Local prototypes function
 ******************************************************************************/
void mg_PfcFaultGpioInit(void);

/*******************************************************************************
 * Local function for the current file
 ******************************************************************************/

/*******************************************************************************
 * Global function for the project
 ******************************************************************************/

/**
  * @brief  Gpio Initialization.
  */
void GPIO_GpioInit(void)
{
  /* Compress Control Gpio Config */
  GPIO_MuxSel(GPIO_COMPRESS_UP,PWM0_OUTA);
  GPIO_MuxSel(GPIO_COMPRESS_UN,PWM0_OUTB);
  GPIO_MuxSel(GPIO_COMPRESS_VP,PWM1_OUTA);
  GPIO_MuxSel(GPIO_COMPRESS_VN,PWM1_OUTB);
  GPIO_MuxSel(GPIO_COMPRESS_WP,PWM2_OUTA);
  GPIO_MuxSel(GPIO_COMPRESS_WN,PWM2_OUTB);
  GPIO_MuxSel(GPIO_COMPRESS_FAULT,0); // GPIO(ERU)

  /* Fan Control Gpio Config */
  GPIO_MuxSel(GPIO_FAN_UP,PWM3_OUTA);
  GPIO_MuxSel(GPIO_FAN_UN,PWM3_OUTB);
  GPIO_MuxSel(GPIO_FAN_VP,PWM4_OUTA);
  GPIO_MuxSel(GPIO_FAN_VN,PWM4_OUTB);
  GPIO_MuxSel(GPIO_FAN_WP,PWM5_OUTA);
  GPIO_MuxSel(GPIO_FAN_WN,PWM5_OUTB);
  GPIO_MuxSel(GPIO_FAN_FAULT,0);  // GPIO

  /* PFC Control Gpio Config */
  GPIO_MuxSel(GPIO_PFC_PWM,PWM7_OUTB);
  GPIO_MuxSel(GPIO_PFC_FAULT,PWM_TZ1_16); // TZ1
  GPIO_MuxSel(GPIO_PFC_CBC  ,PWM_TZ2_17); // TZ2

  mg_PfcFaultGpioInit();

  /* Relay Gpio Config */
  GPIO_OutputEnable(GPIO_PTC_RELAY);
	PTC_RELAY_OFF;

  GPIO_OutputEnable(GPIO_ACFAN_RELAY);
	FAN_RELAY_OFF;

  GPIO_OutputEnable(GPIO_HEAT_RELAY);
	HEAT_RELAY_OFF;

  GPIO_OutputEnable(GPIO_FOUR_WAY_RELAY);
	FOUR_WAY_RELAY_OFF;

  /* UART Gpio Config */
  GPIO_MuxSel(GPIO_WATCHER_TXD,UART0_HS_TXD_29);
  GPIO_MuxSel(GPIO_WATCHER_RXD,UART0_HS_RXD_28);
  GPIO_MuxSel(GPIO_SI_TXD,UART1_LS_TXD_31);
  GPIO_MuxSel(GPIO_SI_RXD,UART1_LS_RXD_30);
  GPIO_MuxSel(GPIO_PC_TXD,UART2_LS_TXD_22);
  GPIO_MuxSel(GPIO_PC_RXD,UART2_LS_RXD_23);

  GPIO_PullUpDownSel(GPIO_WATCHER_RXD,PULL_UP);
  GPIO_PullUpDownSel(GPIO_SI_RXD,PULL_UP);
  GPIO_PullUpDownSel(GPIO_PC_RXD,PULL_UP);

  /* IIC Gpio Config */
  GPIO_MuxSel(GPIO_IIC_SCL,0);
  GPIO_MuxSel(GPIO_IIC_SDA,0);
  GPIO_OutputEnable(GPIO_IIC_SCL);
  GPIO_OutputEnable(GPIO_IIC_SDA);
//  GPIO_PullUpDownSel(GPIO_IIC_SCL,PULL_UP);
//  GPIO_PullUpDownSel(GPIO_IIC_SDA,PULL_UP);
  GPIO_OpenDrainEnable(GPIO_IIC_SCL);
  GPIO_OpenDrainEnable(GPIO_IIC_SDA);
  SET_SCL_HIGH;
  SET_SDA_HIGH;

  /* Electronic Expansion Valve Gpio Config*/
  GPIO_MuxSel(GPIO_MVA,0);
  GPIO_MuxSel(GPIO_MVB,0);
  GPIO_MuxSel(GPIO_MVC,0);
  GPIO_MuxSel(GPIO_MVD,0);
	GPIO_OutputEnable(GPIO_MVA);
	GPIO_OutputEnable(GPIO_MVB);
	GPIO_OutputEnable(GPIO_MVC);
	GPIO_OutputEnable(GPIO_MVD);

  /* LED Gpio Config */
  GPIO_OutputEnable(GPIO_LED1);
  GPIO_OutputEnable(GPIO_LED2);
  GPIO_OutputEnable(GPIO_LED3);
	LED1_OFF;
	LED2_OFF;
	LED3_OFF;

  /* Analog Pin Config */
	GPIO_ModeSel(GPIO_IPM_SEL   ,GPIO_MODE_ANALOG);
	GPIO_ModeSel(GPIO_IAC_AD    ,GPIO_MODE_ANALOG);
	GPIO_ModeSel(GPIO_AIR_AD    ,GPIO_MODE_ANALOG);
	GPIO_ModeSel(GPIO_COIL_AD   ,GPIO_MODE_ANALOG);
	GPIO_ModeSel(GPIO_DIS_AD    ,GPIO_MODE_ANALOG);
	GPIO_ModeSel(GPIO_SUCK_AD   ,GPIO_MODE_ANALOG);
	GPIO_ModeSel(GPIO_VDC_AD    ,GPIO_MODE_ANALOG);
	GPIO_ModeSel(GPIO_IU_AD_COMP,GPIO_MODE_ANALOG);
	GPIO_ModeSel(GPIO_TEMP_COMP ,GPIO_MODE_ANALOG);
	GPIO_ModeSel(GPIO_VAC_AD    ,GPIO_MODE_ANALOG);
	GPIO_ModeSel(GPIO_IUN_AD_FAN,GPIO_MODE_ANALOG);
	GPIO_ModeSel(GPIO_TEMP_FAN  ,GPIO_MODE_ANALOG);
	GPIO_ModeSel(GPIO_IVN_AD_FAN,GPIO_MODE_ANALOG);
}

/**
  * @brief      PFC Fault Signal Config.
  * @retval     void
  */
void mg_PfcFaultGpioInit(void)
{
  /* PFC FAULT */
  ACCESS_ENABLE;
  PB->CFG0_b.CLKDIV = 6;   // Filter Clock = AhbClock / 7
  PB->CFG0_b.FILT = 3;     // Filter pulse less than 3 filter
  PB->CFG1_b.CLKDIV = 6;   // Filter Clock = AhbClock / 7
  PB->CFG1_b.FILT = 3;     // Filter pulse less than 3 filter
  ACCESS_DISABLE;

  /* COMP FAULT */
  ACCESS_ENABLE;
  PC->CFG1_b.CLKDIV = 6;   // Filter Clock = AhbClock / 7
  PC->CFG1_b.FILT = 3;     // Filter pulse less than 3 filter
  ACCESS_DISABLE;

  /* FAN FAULT */
  ACCESS_ENABLE;
  PC->CFG4_b.CLKDIV = 6;   // Filter Clock = AhbClock / 7
  PC->CFG4_b.FILT = 3;     // Filter pulse less than 3 filter
  ACCESS_DISABLE;

  PC->INTTYPE_b.GPIO4 = 1; // Edge
  PC->INTPOL_b.GPIO4  = 0; // Falling edge
  PC->RIS_b.GPIO4 = 1;     // Clear int flag
  PC->INTMASK_b.GPIO4 = 0; // Enable gpio int.
}

/* Function compatible with old version code */
uint8_t GPIO_gPIOIsHigh(uint8_t IoNumb)
{
  uint8_t bFlag;

  bFlag = GPIO_GetGpioStatus(IoNumb);
  return bFlag;
}

/*---------------------------------- End of the file ---------------------------------*/
